Bruno Rodrigues, responsable des départements “statistiques” et “stratégie de données” du Ministère de la Recherche et de l’Enseignement supérieur au Luxembourg
Utilisateur de R depuis 2009
Cette présentation est disponible sur le lien suivant https://is.gd/nix_russ
Code source disponible ici: https://github.com/b-rodrigues/russ_workshop
* C'est quoi Nix?
* Le problème que Nix résoud
* Le *gestionnaire de paquets fonctionnel*
* Le langage Nix
* rix, ou comment utiliser Nix facilement
Le sujet d’aujourd’hui: le gestionnaire de paquets
Nix est un outil complexe
Il faut de l’investissement de la part des utilisateurs
Mais {rix} va nous aider!
Gestionnaire de paquets: un outil pour administrer des …paquets
Paquet: n’importe quel logiciel (pas seulement des paquets R)
Voici un gestionnaire de paquets populaire:
Google Play Store
Installe tous les logiciels nécessaires (R, paquets R, libraries de développement, etc) de manière totalement reproductible et sur n’importe quelle plateforme en écrivant une seule expression dans le langage Nix.
{renv}(Remarque: on peut s’abstraire de rig si Docker inclut la bonne version de R)
Nix permet de tout gérer d’un seul coup!
{renv}) on doit accepter les risques suivants:* Collaborateurs travaillent sur des environnements hétérogènes
* Les analyses produites ne sont (très probablement) pas reproductibles
Nix est un gestionnaire de paquets fonctionnel
Fonctionnel, comme la programmation fonctionnelle inspirée du lambda-calcul
Lambda-calcul? Pour faire simple:
-> f(x)=y
f(x) va toujours donner y
Autrement dit, y ne dépend de rien d’autre que de x qui est transformé par f
The idea is to always deploy component closures: if we deploy a component, then we must also deploy its dependencies, their dependencies, and so on. That is, we must always deploy a set of components that is closed under the ‘’depends on’’ relation. Since closures are selfcontained, they are the units of complete software deployment. After all, if a set of components is not closed, it is not safe to deploy, since using them might cause other components to be referenced that are missing on the target system.
Eelco Dolstra, Nix: A Safe and Policy-Free System for Software Deployment
install.packages("dplyr") ne va pas toujours donner le même résultat!let
pkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/976fa3369d722e76f37c77493d99829540d43845.tar.gz") {};
system_packages = builtins.attrValues {
inherit (pkgs) R ;
};
in
pkgs.mkShell {
buildInputs = [ system_packages ];
shellHook = "R --vanilla";
}
pkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/976fa3369d722e76f37c77493d99829540d43845.tar.gz") {};
system_packages: une variable qui liste les paquets à installersystem_packages = builtins.attrValues {
inherit (pkgs) R ;
};
pkgs.mkShell {
buildInputs = [ system_packages ];
shellHook = "R --vanilla";
}
system_packages (buildInputs)R --vanilla au démarrage (shellHook){rix} est la solution!nixpkgs in the rPackages set!{rix} (website) makes writing Nix expression easy!rix() function:rix::rix() generates a default.nix filenix-build (in terminal) or rix::nix_build() from Rnix-shell"dplyr@1.0.0")Let’s check out expressions/rix_intro/
{rix} makes it easy to run pipelines in the right environment{targets})expressions/nix_targets_pipelinecd /absolute/path/to/pipeline/ && nix-shell default.nix --run "Rscript -e 'targets::tar_make()'"
{targets} pipeline on Github actionsrix::tar_nix_ga() to generate the required filesexpressions/subshellrPackages set gets updated around new R releases (every 3 months or so)nixpkgs fork from our rstats-on-nix organisation!pkgs variable:pkgs = import (fetchTarball "https://github.com/rstats-on-nix/nixpkgs/archive/refs/heads/r-daily.tar.gz") {};
pkgs = import (fetchTarball "https://github.com/rstats-on-nix/nixpkgs/archive/78f705bd8689ad7d215f4b3aea9d9c1302a31b99.tar.gz") {};
{rix}Official Nix documentation: https://nix.dev/
Nix tutorial by INRIA: https://nix-tutorial.gitlabpages.inria.fr/nix-tutorial/
My blog: https://b-rodrigues.github.io/rix/
My book (doesn’t cover Nix, but Docker, {renv} and functional programming): https://raps-with-r.dev/